package modelo;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.TreeMap;

public class DetalleProductoDAO {
	private TreeMap<Pair<Integer, Integer>, DetalleProducto> elementos = new TreeMap<Pair<Integer, Integer>, DetalleProducto>();

	public DetalleProductoDAO() {
		super();
	}
	
	public void cargar() {
		ArrayList<DetalleProducto> arr = Datos.getInstancia().leerBaseDatos("detalle_producto", new CreadorDato<DetalleProducto>() {
			@Override
			public DetalleProducto crear(ResultSet rs) throws SQLException {
				Producto pr = Datos.getInstancia().getProductos().buscar(rs.getInt("producto"));
				Ingrediente ing = Datos.getInstancia().getIngredientes().buscar(rs.getInt("ingrediente"));
				return new DetalleProducto(pr, ing, rs.getDouble("cantidad"));
			}
		});
		
		for (DetalleProducto det : arr)
			elementos.put(new Pair<Integer, Integer>(det.getProducto().getCodigo(), det.getIngrediente().getCodigo()), det);
	}

	public DetalleProducto anadir(Producto pr, Ingrediente ing, double cantidad) {
		Conexion.ejecutar("INSERT INTO detalle_producto (producto, ingrediente, cantidad) VALUES (" + pr.getCodigo() + ", " + ing.getCodigo() + ", " + cantidad + ")");

		DetalleProducto det = new DetalleProducto(pr, ing, cantidad);
		elementos.put(new Pair<Integer, Integer>(det.getProducto().getCodigo(), det.getIngrediente().getCodigo()), det);
		return det;
	}
	
	public void actualizar(DetalleProducto det) {
		String cadena = "UPDATE detalle_producto SET cantidad = " + det.getCantidad() + " WHERE producto = " + det.getProducto().getCodigo() + " AND ingrediente = " + det.getIngrediente().getCodigo();
		Conexion.ejecutar(cadena);
	}
	
	public void eliminar(int producto, int ingrediente) {
		String cadena = "DELETE FROM detalle_producto WHERE producto = " + producto + " AND ingrediente = " + ingrediente;
		Conexion.ejecutar(cadena);
		elementos.remove(new Pair<Integer, Integer>(producto, ingrediente));
	}
	
	public void eliminarPorProducto(int producto) {
		String cadena = "DELETE FROM detalle_producto WHERE producto = " + producto;
		Conexion.ejecutar(cadena);
		
		Iterator<Entry<Pair<Integer, Integer>, DetalleProducto>> it = elementos.entrySet().iterator();
		
		while (it.hasNext()) {
			Entry<Pair<Integer, Integer>, DetalleProducto> det = it.next();
			if (det.getValue().getProducto().getCodigo() == producto)
				it.remove();
		}
	}
	
	public DetalleProducto buscar(int producto, int ingrediente) {
		return elementos.get(new Pair<Integer, Integer>(producto, ingrediente));
	}
	
	public ArrayList<DetalleProducto> detallesGeneral() {
		return adjuntarObjeto(Conexion.consultar("SELECT producto, ingrediente FROM detalle_producto"));
	}
	
	public ArrayList<DetalleProducto> detallesPorProducto(int producto) {
		return adjuntarObjeto(Conexion.consultar("SELECT producto, ingrediente FROM detalle_producto WHERE producto = " + producto));
	}
	
	private ArrayList<DetalleProducto> adjuntarObjeto(ResultSet rs) {
		ArrayList<DetalleProducto> lst = new ArrayList<DetalleProducto>();
		
		try {
			while (rs.next()) lst.add(elementos.get(new Pair<Integer, Integer>(rs.getInt("producto"), rs.getInt("ingrediente"))));
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return lst;
	}
}
